home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / CodeWarrior Lite / Metrowerks C⁄C++ Lite / Libraries / MacOS PPC / PLStringFuncs Glue / PLStringFuncsPPC.c next >
Encoding:
C/C++ Source or Header  |  1995-04-04  |  6.9 KB  |  241 lines  |  [TEXT/MPCC]

  1. /*********************************************************************
  2. This code is adapted from some public domain code written by Matthias
  3. Neeracher.  It allows CW on PPC to call the PLString functions which are
  4. in StdCLib.  We can't always link directly to StdCLib because some symbols
  5. conflict with our own ANSI libraries.
  6. *********************************************************************/
  7.  
  8. #include <Types.h>
  9. #include <FragLoad.h>
  10. #include <PLStringFuncs.h>
  11.  
  12. #if !defined(powerc) && !defined(__powerc)
  13. #error "This file is neither needed nor working on an 68K"
  14. #endif
  15.  
  16. /*********************************************************************
  17.  * These procedure pointers will hold the glue routines to the MPW code
  18.  */
  19.  
  20. static pascal short        (*StdCLib_PLstrcmp)(ConstStr255Param str1, ConstStr255Param str2);
  21. static pascal short     (*StdCLib_PLstrncmp)(ConstStr255Param str1, ConstStr255Param str2, short num);
  22. static pascal StringPtr (*StdCLib_PLstrcpy)(StringPtr str1, ConstStr255Param str2);
  23. static pascal StringPtr (*StdCLib_PLstrncpy)(StringPtr str1, ConstStr255Param str2, short num);
  24. static pascal StringPtr    (*StdCLib_PLstrcat)(StringPtr str1, ConstStr255Param str2);
  25. static pascal StringPtr (*StdCLib_PLstrncat)(StringPtr str1, ConstStr255Param str2, short num);
  26. static pascal Ptr         (*StdCLib_PLstrchr)(ConstStr255Param str1, short ch1);
  27. static pascal Ptr         (*StdCLib_PLstrrchr)(ConstStr255Param str1, short ch1);
  28. static pascal Ptr         (*StdCLib_PLstrpbrk)(ConstStr255Param str1, ConstStr255Param str2);
  29. static pascal short     (*StdCLib_PLstrspn)(ConstStr255Param str1, ConstStr255Param str2);
  30. static pascal Ptr         (*StdCLib_PLstrstr)(ConstStr255Param str1, ConstStr255Param str2);
  31. static pascal short     (*StdCLib_PLstrlen)(ConstStr255Param str);
  32. static pascal short        (*StdCLib_PLpos)(ConstStr255Param str1, ConstStr255Param str2);
  33.  
  34.  
  35. /* 
  36.  * Initialize glue if necessary. The test is done inline in InitStandardLib, 
  37.  * while the actual work is done in a separate procedure DoInitStandardLib.
  38.  */
  39. static Boolean beenThereDoneThat = false;
  40.     
  41. static void DoInitStandardLib()
  42. {
  43.     ConnectionID     StdCLib;
  44.     SymClass        symClass;
  45.     Ptr             whoCares;
  46.     Str255            error;
  47.         
  48.     beenThereDoneThat = true;
  49.     
  50.     /* 
  51.      * We interface to the MPW standard library by dynamically connecting to the 
  52.      * code fragment. This technique has been suggested to me by Charlie Reiman.
  53.      */
  54.     if (GetSharedLibrary(
  55.             (StringPtr)"\pStdCLib", kPowerPCArch, kLoadLib, &StdCLib, &whoCares, error)
  56.     )
  57.         return;
  58.     
  59.     if (FindSymbol (StdCLib, (StringPtr)"\pPLstrcmp", (Ptr *) &StdCLib_PLstrcmp, &symClass))
  60.         goto failed_on_PLstrcmp;
  61.     if (FindSymbol (StdCLib, (StringPtr)"\pPLstrncmp", (Ptr *) &StdCLib_PLstrncmp, &symClass))
  62.         goto failed_on_PLstrncmp;
  63.     if (FindSymbol (StdCLib, (StringPtr)"\pPLstrcpy", (Ptr *) &StdCLib_PLstrcpy, &symClass))
  64.         goto failed_on_PLstrcpy;
  65.     if (FindSymbol (StdCLib, (StringPtr)"\pPLstrncpy", (Ptr *) &StdCLib_PLstrncpy, &symClass))
  66.         goto failed_on_PLstrncpy;
  67.     if (FindSymbol (StdCLib, (StringPtr)"\pPLstrcat", (Ptr *) &StdCLib_PLstrcat, &symClass))
  68.         goto failed_on_PLstrcat;
  69.     if (FindSymbol (StdCLib, (StringPtr)"\pPLstrncat", (Ptr *) &StdCLib_PLstrncat, &symClass))
  70.         goto failed_on_PLstrncat;
  71.     if (FindSymbol (StdCLib, (StringPtr)"\pPLstrchr", (Ptr *) &StdCLib_PLstrchr, &symClass))
  72.         goto failed_on_PLstrchr;
  73.     if (FindSymbol (StdCLib, (StringPtr)"\pPLstrrchr", (Ptr *) &StdCLib_PLstrrchr, &symClass))
  74.         goto failed_on_PLstrrchr;
  75.     if (FindSymbol (StdCLib, (StringPtr)"\pPLstrpbrk", (Ptr *) &StdCLib_PLstrpbrk, &symClass))
  76.         goto failed_on_PLstrpbrk;
  77.     if (FindSymbol (StdCLib, (StringPtr)"\pPLstrspn", (Ptr *) &StdCLib_PLstrspn, &symClass))
  78.         goto failed_on_PLstrspn;
  79.     if (FindSymbol (StdCLib, (StringPtr)"\pPLstrstr", (Ptr *) &StdCLib_PLstrstr, &symClass))
  80.         goto failed_on_PLstrstr;
  81.     if (FindSymbol (StdCLib, (StringPtr)"\pPLstrlen", (Ptr *) &StdCLib_PLstrlen, &symClass))
  82.         goto failed_on_PLstrlen;
  83.     if (FindSymbol (StdCLib, (StringPtr)"\pPLpos", (Ptr *) &StdCLib_PLpos, &symClass))
  84.         goto failed_on_PLpos;
  85.     
  86.     return;
  87.     
  88. failed_on_PLpos:
  89.     StdCLib_PLpos = nil;
  90. failed_on_PLstrlen:
  91.     StdCLib_PLstrlen = nil;
  92. failed_on_PLstrstr:
  93.     StdCLib_PLstrstr = nil;
  94. failed_on_PLstrspn:
  95.     StdCLib_PLstrspn = nil;
  96. failed_on_PLstrpbrk:
  97.     StdCLib_PLstrpbrk = nil;
  98. failed_on_PLstrrchr:
  99.     StdCLib_PLstrrchr = nil;
  100. failed_on_PLstrchr:
  101.     StdCLib_PLstrchr = nil;
  102. failed_on_PLstrncat:
  103.     StdCLib_PLstrncat = nil;
  104. failed_on_PLstrcat:
  105.     StdCLib_PLstrcat = nil;
  106. failed_on_PLstrncpy:
  107.     StdCLib_PLstrncpy = nil;
  108. failed_on_PLstrcpy:
  109.     StdCLib_PLstrcpy = nil;
  110. failed_on_PLstrncmp:
  111.     StdCLib_PLstrncmp = nil;
  112. failed_on_PLstrcmp:
  113.     StdCLib_PLstrcmp = nil;
  114. }
  115.  
  116. inline void InitStandardLib()
  117. {
  118.     if (beenThereDoneThat)
  119.         return;
  120.     DoInitStandardLib();
  121. }
  122.  
  123. pascal short PLstrcmp(ConstStr255Param str1, ConstStr255Param str2)
  124. {
  125.     InitStandardLib ();
  126.     if (StdCLib_PLstrcmp != nil) {
  127.         return StdCLib_PLstrcmp (str1, str2);
  128.     }
  129.     return 0;
  130. }
  131.  
  132. pascal short PLstrncmp(ConstStr255Param str1, ConstStr255Param str2, short num)
  133. {
  134.     InitStandardLib ();
  135.     if (StdCLib_PLstrncmp != nil) {
  136.         return StdCLib_PLstrncmp (str1, str2, num);
  137.     }
  138.     return 0;
  139. }
  140.  
  141. pascal StringPtr PLstrcpy(StringPtr str1, ConstStr255Param str2)
  142. {
  143.     InitStandardLib ();
  144.     if (StdCLib_PLstrcpy != nil) {
  145.         return StdCLib_PLstrcpy (str1, str2);
  146.     }
  147.     return nil;
  148. }
  149.  
  150. pascal StringPtr PLstrncpy(StringPtr str1, ConstStr255Param str2, short num)
  151. {
  152.     InitStandardLib ();
  153.     if (StdCLib_PLstrncpy != nil) {
  154.         return StdCLib_PLstrncpy (str1, str2, num);
  155.     }
  156.     return nil;
  157. }
  158.  
  159. pascal StringPtr PLstrcat(StringPtr str1, ConstStr255Param str2)
  160. {
  161.     InitStandardLib ();
  162.     if (StdCLib_PLstrcat != nil) {
  163.         return StdCLib_PLstrcat (str1, str2);
  164.     }
  165.     return nil;
  166. }
  167.  
  168. pascal StringPtr PLstrncat(StringPtr str1, ConstStr255Param str2, short num)
  169. {
  170.     InitStandardLib ();
  171.     if (StdCLib_PLstrncat != nil) {
  172.         return StdCLib_PLstrncat (str1, str2, num);
  173.     }
  174.     return nil;
  175. }
  176.  
  177. pascal Ptr PLstrchr(ConstStr255Param str1, short ch1)
  178. {
  179.     InitStandardLib ();
  180.     if (StdCLib_PLstrchr != nil) {
  181.         return StdCLib_PLstrchr (str1, ch1);
  182.     }
  183.     return nil;
  184. }
  185.  
  186. pascal Ptr PLstrrchr(ConstStr255Param str1, short ch1)
  187. {
  188.     InitStandardLib ();
  189.     if (StdCLib_PLstrrchr != nil) {
  190.         return StdCLib_PLstrrchr (str1, ch1);
  191.     }
  192.     return nil;
  193. }
  194.  
  195. pascal Ptr PLstrpbrk(ConstStr255Param str1, ConstStr255Param str2)
  196. {
  197.     InitStandardLib ();
  198.     if (StdCLib_PLstrpbrk != nil) {
  199.         return StdCLib_PLstrpbrk (str1, str2);
  200.     }
  201.     return nil;
  202. }
  203.  
  204. pascal short PLstrspn(ConstStr255Param str1, ConstStr255Param str2)
  205. {
  206.     InitStandardLib ();
  207.     if (StdCLib_PLstrspn != nil) {
  208.         return StdCLib_PLstrspn (str1, str2);
  209.     }
  210.     return 0;
  211. }
  212.  
  213. pascal Ptr PLstrstr(ConstStr255Param str1, ConstStr255Param str2)
  214. {
  215.     InitStandardLib ();
  216.     if (StdCLib_PLstrstr != nil) {
  217.         return StdCLib_PLstrstr (str1, str2);
  218.     }
  219.     return nil;
  220. }
  221.  
  222. pascal short PLstrlen(ConstStr255Param str)
  223. {
  224.     InitStandardLib ();
  225.     if (StdCLib_PLstrlen != nil) {
  226.         return StdCLib_PLstrlen (str);
  227.     }
  228.     return 0;
  229. }
  230.  
  231. pascal short PLpos(ConstStr255Param str1, ConstStr255Param str2)
  232. {
  233.     InitStandardLib ();
  234.     if (StdCLib_PLpos != nil) {
  235.         return StdCLib_PLpos (str1, str2);
  236.     }
  237.     return 0;
  238. }
  239.  
  240.  
  241.